package com.xadrez.view;

import com.xadrez.Principal;
import com.xadrez.modelo.Posicao;
import com.xadrez.modelo.Rei;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;

public class MovimentoView {

    private static PecaView pecaAMover = null;

    //Move a peça para alguma posição.
    public static void desenhaAcaoDoMouse(MouseEvent e) {

        TabuleiroView tabuleiroView = TabuleiroView.getInstance();
        PecaView pecaClicada = null;

        Component c = TabuleiroView.getInstance().findComponentAt(e.getX(), e.getY());
        pecaClicada = tabuleiroView.buscaPeca(e.getX(), e.getY());
        // Se entrar no IF - Quer dizer que clicou numa peça: 
        //                              - Pode ser que ele clicou na dele(vai mover);
        //                              - Pode ser que ele clicou na do inimigo(vai comer);
        // Se entrar no ELSE - Quer dizer que ele clicou num campo vazio: 
        //                              - Pode ser que ele clicou num campo para mover uma peca previamente clicada;
        //                              - Pode ser que ele clicou num vazio por nada;
        if (pecaClicada != null) {
            if (pecaClicada.getPeca().getJogador().equals(Principal.getTabuleiro().getJogadorDaVez())) {
                Pintor.pintaQuadrados(pecaClicada);
                pecaAMover = pecaClicada;
            } else {
                Container parent = c.getParent();
                if (parent.getBackground().equals(Cor.getInstance().getCorPecaInimigo())) {
                    come(pecaClicada, pecaAMover);
                    pecaAMover = null;
                }
            }
        } else {
            if (pecaAMover != null && c.getBackground().equals(Cor.getInstance().getCorCampoLivre())) {
                move(pecaAMover, c);
                pecaAMover = null;
            }
        }
    
    // pinta a torre do roque pequeno
        if(pecaAMover != null){
            if (pecaAMover.getPeca() instanceof Rei){   
                if ( ((Rei)pecaAMover.getPeca()).podeRoquePequeno()){
                    Posicao p = TabuleiroView.getInstance().getPosicaoNaView(new Posicao(pecaAMover.getPeca().getPosicaoNoTabuleiro().getX(),7,1));
                    PecaView pecaV = tabuleiroView.buscaPeca(p.getX(),p.getY());
                    Pintor.pintaPosicaoAtual(pecaV);
                }
                if ( ((Rei)pecaAMover.getPeca()).podeRoqueGrande()){
                    Posicao p = TabuleiroView.getInstance().getPosicaoNaView(new Posicao(pecaAMover.getPeca().getPosicaoNoTabuleiro().getX(),0,1));
                    PecaView pecaV = tabuleiroView.buscaPeca(p.getX(),p.getY());
                    Pintor.pintaPosicaoAtual(pecaV);
                }
            }
        }   
    
    }

    public static void desenhaIAMovendo(Posicao posicao, Posicao posicaoAntiga) {
        int tamanho = TabuleiroView.getInstance().TAMANHOQUADRADO;

        TabuleiroView.getInstance().inverte(posicaoAntiga);
        TabuleiroView.getInstance().inverte(posicao);

        PecaView pecaNaPosicao = TabuleiroView.getInstance().buscaPeca(posicao.getX() * tamanho, posicao.getY() * tamanho);
        PecaView pecaDoJogador = TabuleiroView.getInstance().buscaPeca(posicaoAntiga.getX() * tamanho, posicaoAntiga.getY() * tamanho);

        Component c = TabuleiroView.getInstance().findComponentAt(posicao.getX() * tamanho, posicao.getY() * tamanho);

        if(posicaoAntiga.isRoquePequeno()){
            Container parent = c.getParent();
            parent.add(pecaDoJogador.getImagem());
            
            int x = pecaNaPosicao.getPeca().getPosicaoNoTabuleiro().getX();
            Posicao posicaoTorre = new Posicao(x,7);
            pecaNaPosicao = TabuleiroView.getInstance().buscaPeca(posicaoTorre.getX() * tamanho, posicaoTorre.getY() * tamanho);
            Component cr = TabuleiroView.getInstance().findComponentAt(posicao.getX() * tamanho, posicao.getY() * tamanho);
            Container parentR = cr.getParent();
            parentR.add(pecaNaPosicao.getImagem());      
            
        }else if(posicaoAntiga.isRoqueGrande()){
            
            Container parent = c.getParent();
            parent.add(pecaDoJogador.getImagem());
            
            int x = pecaNaPosicao.getPeca().getPosicaoNoTabuleiro().getX();
            Posicao posicaoTorre = new Posicao(x,0);
            pecaNaPosicao = TabuleiroView.getInstance().buscaPeca(posicaoTorre.getX() * tamanho, posicaoTorre.getY() * tamanho);
            Component cr = TabuleiroView.getInstance().findComponentAt(posicao.getX() * tamanho, posicao.getY() * tamanho);
            Container parentR = cr.getParent();
            parentR.add(pecaNaPosicao.getImagem());      

            
            
        }else if (c instanceof JLabel) {
            Container parent = c.getParent();
            parent.remove(0);
            TabuleiroView.getInstance().getPecas().remove(pecaNaPosicao);
            parent.add(pecaDoJogador.getImagem());
        } else {
            Container parent = (Container) c;
            parent.add(pecaDoJogador.getImagem());
        }

        TabuleiroView.getInstance().inverte(posicaoAntiga);
        TabuleiroView.getInstance().inverte(posicao);

        Pintor.limpaTabuleiro();
    }

    public static void move(PecaView pecaView, Component c) {
        Container parent = (Container) c;
        parent.add(pecaView.getImagem());

        Pintor.limpaTabuleiro();
    }

    private static void come(PecaView pecaClicada, PecaView pecaAMover) {
        Posicao posicaoView = TabuleiroView.getInstance().getPosicaoNaView(pecaClicada.getPeca().getPosicaoNoTabuleiro());

        Component c = TabuleiroView.getInstance().findComponentAt(posicaoView.getX(), posicaoView.getY());
        Container parent = c.getParent();
        parent.remove(0);
        TabuleiroView.getInstance().getPecas().remove(pecaClicada);
        parent.add(pecaAMover.getImagem());

        Pintor.limpaTabuleiro();
    }
    
}
